package com.wei.czz.common.enums.common.multiDIct;

import com.wei.czz.common.dto.common.NameValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-12-26 16:41:06
 * className: MultiDictEnum 级联字典类型枚举类
 * version: 1.0
 * description:
 */
@Getter
@AllArgsConstructor
public enum MultiDictEnum {

    /*
        间隔为1000
        所有枚举对象按照value值升序定义
     */

    STORE_CLASS(1, "商店分类"),

    DEPT_MANAGER(1001, "部门管理员"),

    USER_CONFIG(2001, "用户配置"),

    BLOG_AUDIT_REJECT_TYPE(3001, "博客审核拒绝类型"),

    ZIP(4001, "压缩包文件后缀"),

    WEB_SERVER_IP(5001, "web服务ip"),

    ;

    /**
     * 值
     */
    private final Integer value;

    /**
     * 名称
     */
    private final String name;

    /**
     * 获取名称
     * @param value 值
     * @return 名称
     */
    public static String getName(Integer value) {
        MultiDictEnum multiDictEnum = getMultiDict(value);
        if (Objects.nonNull(multiDictEnum)) {
            return multiDictEnum.name;
        }
        return "";
    }

    /**
     * 二分查找级联枚举对象
     * @param value 值对象
     * @return 字典枚举对象
     */
    public static MultiDictEnum getMultiDict(Integer value) {
        MultiDictEnum[] multiDictEnums = values();
        int lo = 0, hi = multiDictEnums.length - 1;
        while (lo <= hi) {
            int mid = (lo + hi) >> 1;
            int res = multiDictEnums[mid].value.compareTo(value);
            if (res > 0) {
                hi = mid - 1;
            } else if (res < 0) {
                lo = mid + 1;
            } else {
                return multiDictEnums[mid];
            }
        }
        return null;
    }

    /**
     * 获取枚举列表
     */
    public static List<NameValue<Integer>> getList() {
        return Stream.of(values())
                .map(multiDictEnum -> new NameValue<>(multiDictEnum.name, multiDictEnum.value))
                .collect(Collectors.toList());
    }

    /**
     * 获取枚举映射
     */
    public static Map<Integer, String> getMap() {
        return Stream.of(values()).collect(Collectors.toMap(MultiDictEnum::getValue, MultiDictEnum::getName));
    }

    /**
     * 获取枚举映射
     */
    public static Map<String, Integer> getNameMap() {
        return Stream.of(values()).collect(Collectors.toMap(MultiDictEnum::getName, MultiDictEnum::getValue));
    }
}
